package cl.tinet.trainee.tarea6b.dao;

import java.io.Serializable;
import java.util.ArrayList;
import cl.tinet.trainee.tarea6b.model.Usuario;
import cl.tinet.trainee.tarea6b.model.UsuarioNoEncontradoException;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;

//import javax.persistence.PersistenceContext;

/**
 * Clase que implementa los metodos de la interfaz InterfazUsuarioBeanDAO.
 * 
 * @author Frmancil
 * 
 */
public class UsuarioDAO implements InterfazUsuarioBeanDAO, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	// @PersistenceContext
	EntityManager em;

	/**
	 * Constructor que inicializa el manejador de entidad em para cada objeto
	 * UsuarioDAO creado.
	 * 
	 * @param em
	 *            Manejador de entidad.
	 */
	public UsuarioDAO(EntityManager em) {
		this.em = em;
	}

	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public void agregar(Usuario nuevoUsuario) {
		em.persist(nuevoUsuario);
	}

	public void borrar(Usuario usuarioAEliminar) throws UsuarioNoEncontradoException {
		
				em.remove(buscar(usuarioAEliminar));
	}

	public void actualizar(Usuario usuarioAActualizar) throws UsuarioNoEncontradoException {


			if (buscar(usuarioAActualizar) != null) {
				em.merge(usuarioAActualizar);
			}

	}

	public Usuario leer(String username) {
		return (Usuario) em
				.createQuery(
						"SELECT U FROM Usuario U WHERE U.username=:username")
				.setParameter("username", username).getSingleResult();
	}

	public Usuario buscar(Usuario usuarioABuscar)
			throws UsuarioNoEncontradoException {
		if ((Usuario) em
				.createQuery(
						"SELECT U FROM Usuario U WHERE U.username=:username")
				.setParameter("username", usuarioABuscar.getUsername())
				.getSingleResult() == null){
			throw new UsuarioNoEncontradoException();
		}
			return (Usuario) em
					.createQuery(
							"SELECT U FROM Usuario U WHERE U.username=:username")
					.setParameter("username", usuarioABuscar.getUsername())
					.getSingleResult();
	}

	@SuppressWarnings("unchecked")
	public ArrayList<Usuario> listar() {
		return (ArrayList<Usuario>) em.createQuery("SELECT U FROM Usuario U")
				.getResultList();
	}

}
